package com.jiangyao.controller;

import com.jiangyao.common.ApiResult;
import com.jiangyao.common.exception.ServerException;
import com.jiangyao.common.utils.JsonUtil;
import com.jiangyao.model.dto.backend.OrgInfoDTO;
import com.jiangyao.model.dto.backend.OrgInfoListPageDTO;
import com.jiangyao.model.dto.backend.OrgInfoSearchDTO;
import com.jiangyao.model.entity.OrgInfo;
import com.jiangyao.model.vo.backend.OrgInfoBaseVO;
import com.jiangyao.model.vo.backend.OrgInfoListVO;
import com.jiangyao.model.vo.backend.OrgInfoVO;
import com.jiangyao.service.OrgInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 * 管理员信息 前端控制器
 * </p>
 *
 * @author yangyongchuan
 * @since 2020-08-13
 */
@RestController
@RequestMapping("/org")
@Api(tags = "组织管理-")
public class OrgInfoController extends BaseController {

	@Autowired
	private OrgInfoService orgInfoService;

	/**
	 * 获取组织列表
	 *
	 * @param orgInfoListPageDTO 列表DTO
	 * @return 结果
	 */
	@ApiOperation(value = "获取组织列表")
	@PostMapping("/list")
	public ApiResult<OrgInfoListVO> getListPage(@Validated({OrgInfoListPageDTO.ListPage.class}) @RequestBody OrgInfoListPageDTO orgInfoListPageDTO) {
		return ApiResult.success(orgInfoService.getListPage(orgInfoListPageDTO));
	}

	/**
	 * 增加组织
	 *
	 * @param orgInfoDTO 增加DTO
	 * @return 结果
	 */
	@ApiOperation(value = "增加组织")
	@PostMapping("/add")
	public ApiResult<String> add(@Validated({OrgInfoDTO.Add.class}) @RequestBody OrgInfoDTO orgInfoDTO) {
		orgInfoService.add(orgInfoDTO);
		return new ApiResult<>("ok");
	}

	/**
	 * 编辑组织
	 *
	 * @param orgInfoDTO 编辑DTO
	 * @return 结果
	 */
	@ApiOperation(value = "编辑组织")
	@PostMapping("/edit")
	public ApiResult<String> edit(@Validated({OrgInfoDTO.Edit.class}) @RequestBody OrgInfoDTO orgInfoDTO) {
		orgInfoService.edit(orgInfoDTO);
		return new ApiResult<>("ok");
	}

	/**
	 * 编辑组织状态（启用、禁用）
	 *
	 * @param orgInfoDTO 编辑DTO
	 * @return 结果
	 */
	@ApiOperation(value = "编辑组织状态（启用、禁用）", notes = "必填字段：orgIdList、status")
	@PostMapping("/editStatus")
	public ApiResult<String> editStatus(@Validated({OrgInfoDTO.Delete.class}) @RequestBody OrgInfoDTO orgInfoDTO) {
		orgInfoService.editStatus(orgInfoDTO);
		return new ApiResult<>("ok");
	}


	/**
	 * 获取组织详情
	 *
	 * @param orgInfoDTO 请求DTO
	 * @return 结果
	 */
	@ApiOperation(value = "获取组织详情", notes = "必填字段：orgId")
	@PostMapping("/detail")
	public ApiResult<OrgInfoVO> detail(@Validated({OrgInfoDTO.Detail.class}) @RequestBody OrgInfoDTO orgInfoDTO) {
		return new ApiResult<>(orgInfoService.getDetail(orgInfoDTO));
	}

	/**
	 * 导出组织
	 *
	 * @param response    response
	 * @param listPageDTO 列表请求DTO json字符串
	 */
	@ApiOperation(value = "导出组织", notes = "列表请求参数DTO转化为json字符串,json字符串还需要URL编码")
	@ApiImplicitParam(name = "listPageDTO", value = "列表请求DTO json字符串", required = true)
	@GetMapping("/export")
	public void export(HttpServletResponse response, @RequestParam String listPageDTO) {
		OrgInfoListPageDTO orgInfoListPageDTO = JsonUtil.parse(listPageDTO, OrgInfoListPageDTO.class);
		orgInfoService.export(response, orgInfoListPageDTO);
	}

	/**
	 * 根据名称检索组织（最多返回50）,用于新建班级选择组织等
	 *
	 * @param searchDTO 检索DTO
	 * @return 结果
	 */
	@ApiOperation(value = "根据名称检索组织（最多返回50）,用于新建班级选择组织等")
	@PostMapping("/searchForSelect")
	public ApiResult<OrgInfoBaseVO> searchForSelect(@RequestBody OrgInfoSearchDTO searchDTO) {
		return ApiResult.success(orgInfoService.searchForSelect(searchDTO), OrgInfoBaseVO.class);
	}

	/**
	 * 获取当前管理员的组织集合
	 */
	@ApiOperation(value = "获取当前管理员的组织集合")
	@PostMapping("/getAdminOrgList")
	public ApiResult<OrgInfo> getAdminOrgList() {
		try {
			return ApiResult.success(orgInfoService.getAdminOrgList());
		} catch (ServerException e) {
			return ApiResult.error(e.getCode(),e.getMessage());
		}
	}

}

